package demo3

import "fmt"

// TestDemo311 如何使用闭包将函数作为返回值
func TestDemo311() {
	// demo1: 函数作为返回值
	p2 := add2()

	fmt.Printf("Call add2 for 3 gives: %v\n", p2(3))

	twoAdder := adder(2)
	fmt.Printf("The result is %v\n", twoAdder(3))

	// demo2: 函数作为返回值
	var f = adder2()
	fmt.Print(f(1), " - ")
	fmt.Print(f(20), " - ")
	fmt.Print(f(300), " - ")
	fmt.Println()
}

// demo1: 函数作为返回值
func add2() func(b int) int {
	return func(b int) int {
		return b + 2
	}
}
func adder(a int) func(b int) int {
	return func(b int) int {
		return a + b
	}
}

// demo2: 函数作为返回值
func adder2() func(int) int {
	// 闭包保存的变量值
	// 在闭包中使用到的变量可以是在闭包函数体内声明的，也可以是在外部函数声明的：
	var x int
	return func(delta int) int {
		x += delta
		return x
	}
}
